#include <iostream>

using std::cout;
using std::endl;

//纯虚函数作为接口使用的
//
//如果一个类中声明了纯虚函数，那么该类是不能创建对象，该类
//称为抽象类
class Base
{
public:
    //纯虚函数
    //不实现该函数，但是可以将该函数的实现留给派生类实现
    virtual void print() = 0;
    virtual void show() = 0;
    /* void print(int x) */
    /* { */

    /* } */
};

//如果抽象类的派生类没有实现所有的纯虚函数，那么抽象类的派生
//类也是抽象类,该派生类也是不能创建对象的
class Derived
: public Base
{
public:
    //虚函数进行重写的时候，可以在派生类中加上override
    virtual void print() override 
    {
        cout << "virtual void Derived::print()" << endl;
    }
};

class Derived2
: public Derived
{
public:
    virtual void show() override 
    {
        cout << "virtual void Derived2::show()" << endl;
    }

};

void test()
{
    /* Base base;//error */
    /* Derived derived;//error */
    /* derived.print(); */

    Derived2 derived2;
    derived2.print();
    derived2.show();

    //不能给抽象类创建对象，也不能给不完整类型创建对象，但是
    //可以给抽象类创建指针，也可以给不完整类创建指针。因为
    //只要系统一定，那么指针的大小就确定了
    Base *pbase = &derived2;
    Derived *pderived = &derived2;
    pbase->print();
    pbase->show();

    pderived->print();
    pderived->show();

}

int main(int argc, char **argv)
{
    test();
    return 0;
}

